"""安装cudatookit，版本要比电脑的显卡CUDA版本低，高版本的pytorch不一定兼容低版本cudatoolkit, 装对cudatoolkit后还用不了GPU就下载低版本的pytorch"""
import torch
import numpy as np
print(torch.__version__)
"""
CPU: 类型定义用dytype, 不指定GPU默认都是CPU类型数据
GPU: 类型定义用torch.device，必须指定才能用，加减等运算必须都是GPU类型的数据才可以进行

注意：所有在CPU上的Tensors, 除了CharTensor, 都可以转换为Numpy array并可以反向转换.
"""

"""1. numpy 与 tensor 的转换"""
"""
底层共享，即都指向同一地址，
改变其中一个，另一个也会改变
"""
# 1.1 tensor to numpy
a = torch.ones(5)
b = a.numpy()
# print(a)
# print(b)
a.add_(1)
# print(a)
# print(b)

# 1.2 numpy to tensor
a2 = np.ones(5)
b2 = torch.from_numpy(a2)
np.add(a2, 1, out=a2)
print(a2)
print(b2)
print(torch.cuda.is_available())
"""2. CPU to GPU"""
if torch.cuda.is_available():
    print(torch.cuda.is_available())
    device = torch.device("cuda")           # 指定GPU设备 可以cuda:0

    x = torch.ones(2,)
    y = torch.rand_like(x, device = device) # 创建一个与x同形状的GPU类型张量y
    x = x.to(device)                        # 把x也放到GPU上
    z = x + y
    print(z)
	# 将z转移到CPU上面, 并同时指定张量元素的数据类型
    print(z.to("cpu", torch.double))


















